
// 创建一个数组包含所有合法的
// 合法的编码范围:
// 数字: 48 - 57    charCode >= 48 && charCode <= 57
// 大写: 65 - 90    charCode >= 65 && charCode <= 90
// 小写: 97 - 122   charCode >= 97 && charCode <= 122
// 下划线: 95       charCode == 95

// 根据编码范围生成字符 放到数组中
var numList = [];
for (var i = 48; i <= 57; i++) {
    var char = String.fromCharCode(i);
    numList.push(char);
}
// console.log(numList);

var bigList = [];
for (var i = 65; i <= 90; i++) {
    var char = String.fromCharCode(i);
    bigList.push(char);
}
// console.log(bigList);

var smallList = [];
for (var i = 97; i <= 122; i++) {
    var char = String.fromCharCode(i);
    smallList.push(char);
}
// console.log(smallList);

var speList = ["_"]; //允许使用的特殊字符

var normalList = numList.concat(bigList, smallList, speList);
// console.log(normalList);

// 随机验证码(数字 大写 小写   不重复)
// function randCode(){
//     var codeList = numList.concat(bigList,smallList);
//     var str= "";
//     for(var i=0;i<4;i++){
//         var index = Math.floor(Math.random()*codeList.length);
//         var char = codeList[index];
//         if(!str.includes(char)){
//             str += char;
//         }else{
//             i--;
//         }
//     }
//     return  str;
// }

// 随机验证码(数字 大写 小写   不重复  每种至少一种)
// 思路1: 判断数字 大写 小写 是否都有 -> 没有就再来一遍
// 思路2: 分别从 numList smallList bigList 和codeList中分别随机 放到数组中(数组乱序)
function randCode(){
    var codeList = numList.concat(bigList,smallList);
    var str= "";
    for(var i=0;i<4;i++){
        var index = Math.floor(Math.random()*codeList.length);
        var char = codeList[index];
        if(!str.includes(char)){
            str += char;
        }else{
            i--;
        }
    }

    // 假设不存在
    var isExistNum = false;
    var isExistBig = false;
    var isExistSmall = false;

    for (var char of str) {
        if (numList.includes(char)) {
            isExistNum = true;
        } else if (smallList.includes(char)) {
            isExistSmall = true;
        } else if (bigList.includes(char)) {
            isExistBig = true;
        } 
    }

    var level = isExistNum + isExistBig + isExistSmall ;

    if(level==3){
        return str;
    }
    // console.log("再来一次");
    return  randCode(); // 再来一次 返回本次结果
}
